<?php
/**
 * @date        <!-- phpDesigner :: Timestamp [08-07-2010 14:24:43] -->
 * @filesource  function.misc.php
 * @package     WebCms
 * @copyright	Copyright (C) 2010
 * @author      Sérgio 'Horizak' Alves
 */

// Sem acesso directo
defined('_WEXEC') or die('Restricted access');

/**
 * Junta duas arrays
 * 
 * @var         array $array - primeira array
 * @var         array $merge - array para juntar a primeira array
 * @var         array $params - parâmetros opcionais
 * @return      array com as duas arrays juntas
 */
function cms_arrayMerge($array,$merge,$params = array()) {
  if (is_array($array)) {
    if (is_array($merge)) {
      foreach ($merge as $k => $v) {
        if (isset($array[$k]) && is_array($v) && is_array($array[$k])) $array[$k] = cms_arrayMerge($array[$k],$v);
        else  $array[$k] = $v;
      }
    } else  cms_error(100,'merge is not a array');
  } elseif (strlen($array) == 0 || $array == 0) $array = $merge;

  return $array;
}

/**
 * Cria/Remove cookies
 * 
 * @var         string $name - nome do cookie
 * @var         string $value - valor do cookie
 * @var         string $expire - duração cookie | definido = next year
 * @var         string $patch - caminho do cookie
 * @var         array $params - parâmetros opcionais
 */
function cms_cookie($name,$value = null,$expire = null,$patch = null,$params = array()) {
  $server = cms_getGlobals('server');

  $patch = isset($patch) ? $patch : '/'.$server['dir_u'];

  if (is_null($value)) $expire = cms_date('time','last week');
  else {
    if (isset($expire)) {
      $expire = is_int($expire) ? $expire : cms_date('time',$expire);
    } else  $expire = cms_date('time','next year');
  }

  if (!setcookie($name,$value,$expire,$patch)) cms_error(100,"Error set cookie Name:({$name}), Value:{$value}, Expire:{$expire}, Patch:{$patch}");
}

/**
 * Retorna a data
 * 
 * @var         string $date - formato da data | opções: mysql/time/log/(anydate)
 * @var         string $value - valor para converter em time
 * @var         array $params - parâmetros opcionais
 * @return      string date/integer time
 */
function cms_date($date = null,$value = null,$params = array()) {
  if ($date == 'mysql') $date = 'Y-m-d H:i:s';
  elseif ($date == 'log') $date = 'Y-m-d H:i:s.u';
  elseif ($date == 'time' and !$value) $value = 'now';

  if ($date == 'time') return strtotime($value);
  elseif ($date and $value) return date(str_replace('.u','.'.substr(microtime(),2,4),$date),$value);
  elseif ($date) return date(str_replace('.u','.'.substr(microtime(),2,4),$date));
  else  cms_error(100,"cms_date: An error occurred with date:({$date}), Value:{$value}");
}

/**
 * Mostra o valor definido
 * 
 * @var         string $value - valor a verificar se esta definido
 * @var         array $params - parâmetros opcionais
 * @return      string
 */
function cms_defined($value,$params = array()) {
  if (defined($value)) return constant($value);
  else  return $value;
}

/**
 * Tratar valores para passar para o sql
 * 
 * @var         string $value - valor a ser tratado
 * @var         array $params - parâmetros opcionais
 * @return      string
 */
function cms_escapeSql($value,$params = array()) {
  if (!is_numeric($value)) {
    $value = get_magic_quotes_gpc() ? stripslashes($value) : $value;
    $value = function_exists('mysql_real_escape_string') ? mysql_real_escape_string($value) : mysql_escape_string($value);
  }
  return $value;
}

/**
 * Retorna as globals
 * 
 * @var         string/array $global -  globais para receber | opções: array/nome/null
 * @var         array $params - parâmetros opcionais
 * @return      string/array
 */
function cms_getGlobals($global = null,$params = array()) {
  global $cms;

  if (is_null($global)) return $cms->global;
  elseif (is_array($global))
    foreach ($global as $v) $return[$v] = $cms->global[$v];
    elseif (isset($cms->global[$global])) $return = $cms->global[$global];

  if (isset($return)) return $return;
  else  return false;
}

/**
 * Junta as pastas, utilizando o separadore de diretório apropriado
 * 
 * @return      string
 */
function cms_join_path() {
  $args = func_get_args();
  return implode(DS,$args);
}

/**
 * Pega o link de onde veio
 * 
 * @var         array $params - parâmetros opcionais
 * @return      string
 */
function cms_linkReferer($params = array()) {
  if (isset($_SERVER['HTTP_REFERER'])) return $_SERVER['HTTP_REFERER'];
  else  return false;
}

/**
 * Redirecciona a página para um url passado
 * 
 * @var         string $url - url para onde redirecionar
 * @var         string $time - tempo para redirecionar
 * @var         array $params - parâmetros opcionais
 */
function cms_redirect($url,$time = null,$params = array()) {
  if (!$url) {
    cms_error(100,"cms_redirect: not received the url");
    return false;
  }

  if (!is_numeric($time)) $time = 0;

  if (headers_sent()) echo "<script type=\"text/javascript\">setTimeout(\"location.replace('".$url."')\",{$time});</script>";
  else  header("Refresh:{$time}; Url={$url}");
}

/**
 * Procura pastas/ficheiros
 * 
 * @var         string $dir - diretório para a procura
 * @var         boolean $sub - procurar sub diretórios ou não | definido: false
 * @var         string $get - procurar pastas ou ficheiros ou ambos | opções: all/files/folders | definido: all
 * @var         array $params - parâmetros opcionais
 * @param       string $fileFilter - filtro de ficheiros
 * @param       string $folderFilter - filtro de pastas
 * @return      array
 */
function cms_searchF($dir,$sub = false,$get = 'all',$params = array()) {
  $fileFilter = isset($params['fileFilter']) ? $params['fileFilter'] : null;
  $folderFilter = isset($params['folderFilter']) ? $params['folderFilter'] : null;

  if ($handle = opendir($dir)) {
    $files = array();
    $innerFiles = array();
    $x = 0;
    while ($value = readdir($handle)) {
      if (is_dir($dir.$value) && !in_array($value,array('.','..'))) {
        if ($get == 'folders' || $get == 'all') {
          if (stripos($value,$folderFilter) == true or is_null($folderFilter)) {
            $files[$x][0] = 'folder';
            $files[$x][1] = $value;
            $files[$x][2] = $dir.$value.DS;
            $x++;
          }
        }
        if ($sub) {
          $innerFiles = cms_searchF($dir.$value.DS,$sub,$get,array('fileFilter' => $fileFilter,'folderFilter' => $folderFilter));
          if (is_array($innerFiles)) $files = cms_arrayMerge($files,$innerFiles);

          $x = count($files) + 1;
        }
      } elseif (is_file($dir.$value) && !in_array($value,array('.','..'))) {
        if ($get == 'files' || $get == 'all') {
          if (!is_null($fileFilter)) {
            if (stripos($value,$fileFilter) == true or is_null($fileFilter)) {
              $files[$x][0] = 'file';
              $files[$x][1] = $value;
              $files[$x][2] = $dir.$value;
              $x++;
            }
          } else {
            $files[$x][0] = 'file';
            $files[$x][1] = $value;
            $files[$x][2] = $dir.$value;
            $x++;
          }
        }
      }
    }
    closedir($handle);
    return $files;
  }
}

/**
 * Calcula a duração de carregamento do script
 * 
 * @var         string $startTime - tempo que iniciou o script
 * @var         array $params - parâmetros opcionais
 * @return      integer
 */
function cms_timeScript($startTime,$params = array()) {
  list($msec,$sec) = explode(' ',$startTime);
  $startTime = (float)$msec + (float)$sec;

  list($msec,$sec) = explode(' ',microtime());
  $endTime = (float)$msec + (float)$sec;

  cms_error(100,'Page load in: '.round($endTime - $startTime,4).' seconds');
}
?>